জাভা জেনেরিক্সে Wildcards ব্যবহার করে জেনেরিক টাইপের আরও বেশি নমনীয়তা অর্জন করা যায়। বিশেষত, Bounded Wildcards ব্যবহার করে নির্দিষ্ট সীমার মধ্যে জেনেরিক টাইপগুলিকে সীমাবদ্ধ করা যায়। এটি ডেটা টাইপগুলির মাঝে আরও ভালো টাইপ সুরক্ষা এবং পুনঃব্যবহারযোগ্য কোড লিখতে সাহায্য করে।
Wildcards এবং এর ধরনসমূহ
Wildcards হল একটি প্রশ্নবোধক চিহ্ন (?), যা "কোনো টাইপ" বোঝায়। এটি তিনটি প্রধান ধরণের হতে পারে:
- Unbounded Wildcards (
?): যেকোনো টাইপ গ্রহণ করতে পারে। - Upper Bounded Wildcards (
? extends Type): নির্দিষ্ট টাইপ বা তার সাবটাইপ গ্রহণ করতে পারে। - Lower Bounded Wildcards (
? super Type): নির্দিষ্ট টাইপ বা তার সুপারটাইপ গ্রহণ করতে পারে।
১. Unbounded Wildcards (?)
? ব্যবহার করা হয় যখন জেনেরিক টাইপের কোনো নির্দিষ্ট সীমা দরকার নেই।
উদাহরণ:
import java.util.List;
public class Main {
public static void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
public static void main(String[] args) {
List<String> stringList = List.of("Java", "Generics", "Wildcard");
List<Integer> intList = List.of(1, 2, 3);
printList(stringList);
printList(intList);
}
}
২. Upper Bounded Wildcards (? extends Type)
? extends Type ব্যবহার করা হয় যেখানে জেনেরিক টাইপটি একটি নির্দিষ্ট টাইপের সাবক্লাস বা ইনটারফেস হতে হবে। এটি Covariant আচরণ প্রদান করে।
উদাহরণ:
import java.util.List;
public class Main {
// Method to calculate sum of a list of Numbers or its subclasses
public static double sumList(List<? extends Number> list) {
double sum = 0.0;
for (Number num : list) {
sum += num.doubleValue();
}
return sum;
}
public static void main(String[] args) {
List<Integer> intList = List.of(1, 2, 3);
List<Double> doubleList = List.of(1.1, 2.2, 3.3);
System.out.println("Sum of intList: " + sumList(intList));
System.out.println("Sum of doubleList: " + sumList(doubleList));
}
}
আউটপুট:
Sum of intList: 6.0
Sum of doubleList: 6.6
৩. Lower Bounded Wildcards (? super Type)
? super Type ব্যবহার করা হয় যেখানে জেনেরিক টাইপটি একটি নির্দিষ্ট টাইপের সুপারক্লাস হতে হবে। এটি Contravariant আচরণ প্রদান করে।
উদাহরণ:
import java.util.List;
import java.util.ArrayList;
public class Main {
// Method to add elements into a list
public static void addElements(List<? super Integer> list) {
list.add(10);
list.add(20);
list.add(30);
}
public static void main(String[] args) {
List<Number> numberList = new ArrayList<>();
addElements(numberList);
System.out.println("Number List: " + numberList);
}
}
আউটপুট:
Number List: [10, 20, 30]
Bounded Wildcards এর সুবিধা
- Code Flexibility: এটি একই মেথড বা ক্লাসকে বিভিন্ন টাইপের জন্য ব্যবহারযোগ্য করে।
- Type Safety: টাইপ সুরক্ষা নিশ্চিত করে।
- Reuse of Code: একই লজিক বিভিন্ন টাইপের উপর প্রয়োগ করা যায়।
Wildcard Limitations
- Insertion Limitation:
? extendsএর ক্ষেত্রে নতুন উপাদান যোগ করা যায় না (কেবলমাত্রnullযোগ করা যায়)। - Complexity: প্রাথমিক পর্যায়ে Wildcards বুঝতে কিছুটা জটিল হতে পারে।
Wildcards এবং Bounded Types ব্যবহার করলে জেনেরিক কোড আরও বেশি শক্তিশালী এবং নমনীয় হয়। এগুলোর সঠিক ব্যবহার করলে টাইপ সুরক্ষা এবং কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
Read more